package br.edu.unifei.cct720.trabalho06.utils.arquivo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import br.edu.unifei.cct720.trabalho06.model.ponto.Pontos;
import br.edu.unifei.cct720.trabalho06.model.ponto.Ponto;

/**
 * Classe responsavel por interagir com o
 * arquivo de dados que contem as dimensoes
 * do poligono
 * 
 * @author fknappe
 *
 */
public class ArquivoPoligono extends File {

	// Declaracao das variaveis de instancia
	private BufferedReader stream;
	private Pontos pontos;

	/**
	 * Construtor 
	 * 
	 * @param String caminhoArquivo
	 * @throws IllegalArgumentException
	 */
	public ArquivoPoligono(String caminhoArquivo) throws IllegalArgumentException {
		super(caminhoArquivo);
		this.pontos = new Pontos();
	}

	/**
	 * Metodo responsavel para abertura do arquivo para leitura
	 * 
	 * @return BufferedReader
	 * @throws IOException
	 */
	public BufferedReader abrirArquivo() throws IOException {
		this.stream = new BufferedReader(
				new FileReader(
						new File(this.getAbsolutePath())
				)
		);
		return this.stream;
	}

	/**
	 * Metodo responsavel por fechar o stream do arquivo
	 * 
	 * @return void
	 * @throws IOException, NullPointerException
	 */
	public void fecharArquivo() throws IOException, NullPointerException {
		this.stream.close();
		this.stream = null;
	}


	/**
	 * Metodo utilizado para verificacao
	 * status do stream do arquivo
	 * 
	 * @return boolean
	 */
	public boolean isFechado() {
		return (this.stream == null) ? true : false;
	}

	/**
	 * Metodo responsavel por verificar se o arquivo
	 * esta pronto para leitura
	 * 
	 * @return boolean
	 * @throws IOException
	 */
	protected boolean isReady() throws IOException {
		if(this.stream == null) {
			this.abrirArquivo();
		} 
		return true;
	}

	// Metodos getters e setters
	public Pontos getPontos() throws IOException {
		
		// Declaracao das variaveis locais
		String line = "";
		String[] tokens = null;
		int x, y = 0;
		
		// Carregando os pontos presentes no arquivo
		if(!(pontos.size() > 0)) {
			if(this.isReady()) {
				while (this.stream.ready()) {
					line = this.stream.readLine().trim().replaceAll("\\s{2,}", " ");
					tokens = line.split(" ");

					x = Integer.parseInt(tokens[0]);
					y = Integer.parseInt(tokens[1]);

					if (x < 0 || y < 0)
						break;

					pontos.add(new Ponto(x, y, null));
				}
			}
		}
		return pontos;
	}
}
